package com.gameley.dmgtpf.common.exception;

import java.io.PrintWriter;
import java.io.StringWriter;

/**
 * 异常处理的工具类
 * @author：LiBencheng<br>
 * @date Created on 2021年7月27日<br>
 * @version 1.0<br>
 */
public final class ExceptionUtil
{
    
    /**
     * *********************************************************** <br>
     * *说明： <br>
     * @see <br>
     * @param message
     * @return <br>
     * @Throwable <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#throwException <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:07:29 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static Throwable throwException(String message)
    {
        
        MyCustomException ex = new MyCustomException(message);
        
        throw new MyRuntimeException(ex);
    }
    
    /**
     * *********************************************************** <br>
     * *说明： <br>
     * @see <br>
     * @param th
     * @return <br>
     * @Throwable <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#throwException <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:07:26 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static Throwable throwException(Throwable th)
    {
        return throwException(th.toString());
    }
    
    /**
     * *********************************************************** <br>
     * *说明： <br>
     * @see <br>
     * @param s
     * @param errorCode
     * @return <br>
     * @Throwable <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#throwException <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:07:34 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static Throwable throwException(String s, String errorCode)
    {
        MyCustomException ex = new MyCustomException(s, errorCode);
        
        throw new MyRuntimeException(ex);
    }
    
    /**
     * *********************************************************** <br>
     * *说明： <br>
     * @see <br>
     * @param th
     * @param errorCode
     * @return <br>
     * @Throwable <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#throwException <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:07:39 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static Throwable throwException(Throwable th, String errorCode)
    {
        return throwException(th.toString(), errorCode);
    }
    
    /**
     * *********************************************************** <br>
     * *说明：获取异常信息<br>
     * @see <br>
     * @param th
     * @return <br>
     * @String <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#stackTraceToString <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:07:45 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static String stackTraceToString(Throwable th)
    {
        StringWriter sw = new StringWriter();
        th.printStackTrace(new PrintWriter(sw, true));
        return sw.toString();
    }
    
    /**
     * *********************************************************** <br>
     * *说明： 只返回指定包中的异常堆栈信息<br>
     * @see <br>
     * @param th 异常信息
     * @param packageName 只转换某个包下的信息
     * @return <br>
     * @String <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#stackTraceToString <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:08:09 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static String stackTraceToString(Throwable th, String packageName)
    {
        String str = stackTraceToString(th);
        if (packageName == null)
        {
            return str;
        }
        String[] arrs = str.split("\n");
        StringBuffer sbuf = new StringBuffer();
        sbuf.append(arrs[0] + "\n");
        for (int i = 0; i < arrs.length; i++)
        {
            String temp = arrs[i];
            if (temp != null && temp.indexOf(packageName) > 0)
            {
                sbuf.append(temp + "\n");
            }
        }
        return sbuf.toString();
    }
    
    /**
     * *********************************************************** <br>
     * *说明： 获取堆栈信息<br>
     * @see <br>
     * @param th
     * @return <br>
     * @String <br>
     * @methods com.gameley.dmgtpf.common.exception.ExceptionUtil#getStackTrace <br>
     * @author LiBencheng <br>
     * @date Created on 2021年7月27日 <br>
     * @time 下午6:07:59 <br>
     * @version 1.0 <br>
     *************************************************************          <br>
     */
    public static final String getStackTrace(Throwable th)
    {
        if (th == null) return "Throwable{[null]}没有堆栈信息！";
        
        StringBuffer msg = new StringBuffer(th.toString() + "\r\n");
        StackTraceElement[] stackTrace = th.getStackTrace();
        for (int i = 0, j = stackTrace.length; i < j; i++)
        {
            msg.append("        at " + stackTrace[i] + "\r\n");
        }
        
        return msg.toString();
    }
    
}
